package com.cwt_taxi_xa.protocol;

import android.annotation.SuppressLint;

import com.cwt_taxi_xa.constants.SPConstants;
import com.cwt_taxi_xa.util.AppLog;
import com.cwt_taxi_xa.util.ByteArrayUtil;
import com.cwt_taxi_xa.util.ExceptionUtil;
import com.cwt_taxi_xa.util.SPUtils;
import com.cwt_taxi_xa.util.Tools;


/**
 * @author wlh
 * 编码55AA协议
 */
@SuppressLint("SimpleDateFormat")
public class EncoderSZ55aa {

	private static final String TAG = "EncoderCD55aa";


	/**
	 * 2.12	中心指令 （必选）
	 *
	 * 控制命令	UINT16
	 * params[0]	1：查询计价器状态
	 * params[1]	1：查询运价参数
	 * params[2]	1：查询刷卡记录（查询，按照bit3返回刷卡记录，第一次收到查询记录时始终返回最近一条刷卡记录）；
	 * 		     		 停止查询刷卡记录（此时bit3无效）
	 * params[3]	1：查询下一条刷卡记录；0：查询上一条记录
	 * params[4]	1：查询刷卡汇总数据
	 * params[5-7]	预留
	 * params[8]	1：锁定计价器；0：解锁计价器
	 * params[9]	1：文件下发
	 * params[10]	1：刷卡下行数据
	 * params[11-15]	预留
	 * @return
	 */
	public static byte[] centraOrder(byte[] stateByte){
		try {
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0100",stateByte);
			AppLog.i("2.12	中心指令 （必选）："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 2.13	数据传输结果（必选）
	 * @param result 0x00 空闲
	 * 				 0x01 没有网络
	 * 				 0x02传输失败
	 * 				 0x03传输成功
	 * 				 0x04 正在传输
	 * @return
	 */
	public static byte[] dataTransResult(int result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.int2Bytes(result, 1), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0101",data);
			AppLog.i("数据传输结果（必选）"+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 2.15	刷卡数据下行透传（保留）
	 * @param vendorId	厂商标识	UINT32	1：天府通 	2：和信通	其他预留
	 * @param data		刷卡数据	BYTE[N]
	 * @return
	 */
	public static byte[] driverCardData(String vendorId, String cardData){
		try {
			int num = 0;
			byte[] cardDataByte = Tools.stringToByte(cardData);
			byte[] data = new byte[4 + cardDataByte.length];
			System.arraycopy(Tools.parseHexStr2Byte(Tools.str2HexStr(vendorId)), 0, data, num,4);
			num += 4;
			System.arraycopy(cardDataByte, 0, data, num,cardDataByte.length);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0103",data);
			AppLog.i("刷卡数据下行透传（保留）："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 2.18	文件查询指令 （必选）
	 * @param result 文件类型	UINT8	0：没有文件
	 * 								1：冷黑名单
	 * 								2：热黑名单
	 * 								3：天府通公钥信息
	 * 								4：天府通IC卡参数
	 * 								5：天府通PSAM密钥
	 * 								6：和信通公钥信息
	 * 								7：和信通IC卡参数
	 * 								8：和信通ESAM密钥
	 * 								9：模块程序文件
	 * @param version    文件版本	BCD[3]	YYMMDD
	 * @param length    文件总长度	UINT32	单位：字节，最大支持140KB。
	 * @return
	 */
	public static byte[] checkFile(String result, String version, String length){
		try {
			int num = 0;
			byte[] data = new byte[8];
			//文件类型	UINT8
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, num, 1);
			num += 1;
			//文件版本	BCD[3]	YYMMDD
			System.arraycopy(Tools.str2Bcd(version), 0, data, num, 3);
			num += 3;
			//文件总长度	UINT32	单位：字节，最大支持140KB。
			System.arraycopy(Tools.parseHexStr2Byte(length), 0, data, num, 4);

			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0106",data);
			AppLog.i("文件查询指令（必选）"+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 2.19	文件传输指令 （必选）
	 * @param 文件内容	BYTE[]
	 * @param 校验		BYTE	所有文件内容的异或值
	 * @return
	 */
	public static byte[] transFile(byte[] file, byte[] fileData){
		try {
			int num = 0;
			byte[] data = new byte[8];
			//文件内容	BYTE[]
			System.arraycopy(file, 0, data, num, file.length);
			num += file.length;
			//BYTE	所有文件内容的异或值
			System.arraycopy(fileData, 0, data, num, fileData.length);
			num += 3;

			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0107",data);
			AppLog.i("文件传输指令（必选）"+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 10.4.2.4 单次营运开始通知应答数据消息
	 * @param result 0x90：执行正确；0xFF：执行错误
	 * @return
	 */
	public static byte[] operationNoticeAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E7",data);
			AppLog.i("单次营运开始通知应答数据消息数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 运结束后营运数据发送应答数据消息
	 * @param result 0x90：执行正确；0xFF：执行错误
	 * @return
	 */
	public static byte[] endNoticeAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E8",data);
			AppLog.i("运结束后营运数据发送应答数据消息数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 计价器营运数据补传应答数据消息
	 * @param result 0x90：正确；0xFF：校验错误
	 * @return
	 */
	public static byte[] meterOperatingDataAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00F2",data);
			AppLog.i("计价器营运数据补传应答数据消息数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 2.7	计价器开机消息（必选）应答
	 * @param result 0x90：正确；0xFF：校验错误
	 * @return
	 */
	public static byte[] meterPowerOnAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E1",data);
			AppLog.i("计价器开机消息（必选）应答数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 2.8	计价器关机指令（必选）应答
	 * @param result 0x90：正确；0xFF：校验错误
	 * @return
	 */
	public static byte[] meterPowerOffAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E4",data);
			AppLog.i("计价器关机指令（必选）应答数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 计价器开机应答数据消息
	 * @param businessLiceNumber 经营许可证号	BYTE[16]	ASCII字符，长度不足16byte，右补0x00
	 * @param certifNumber 司机从业资格证号	BYTE[19]	ASCII字符，长度不足19byte，右补0x00
	 * @param carNumber 车牌号	BYTE[6]	车牌号，ASCII字符
	 * @param creditCardTime 刷卡时间	BCD[6]	格式为YYYY-MM-DD-hh-mm
	 * @param isustate ISU状态
	 * @param timeLimit 时间限制	BCD[5]	格式为YYYY-MM-DD-hh，全0表示无时间限制
	 * @param numberTimes 次数限制	BCD[2]	0000表示无限制
	 * @param result 0x90：执行正确；0xFX：执行错误，X为错误代码其含义：“F” 表示卡片不存在；“1” 卡片非有效证件；“6”刷卡失败。操作结果为0x90 时，1‐7 项数据有效 其他错误，1‐3 项数据不做判断（限制时间及限制次数为有效数据）。
	 * @return
	 */
	public static byte[] meterBootAnswer(String businessLiceNumber,String certifNumber,String carNumber,String creditCardTime,int isustate,String timeLimit,String numberTimes,String result){
		try {

			byte[] data = new byte[57];
			int dstPos = 0;
			//经营许可证号
			System.arraycopy(Tools.stringToByte(Tools.appendRight(businessLiceNumber, 16)), 0, data, dstPos,16);
			dstPos+=16;

			//司机从业资格证号
			System.arraycopy(Tools.stringToByte(Tools.appendRight(certifNumber, 19)), 0, data, dstPos,19);
			dstPos+=19;

			//车牌号
			System.arraycopy(Tools.stringToByte(Tools.appendRight(carNumber, 6)), 0, data, dstPos,6);
			dstPos+=6;

			//刷卡时间
			System.arraycopy(Tools.str2Bcd(creditCardTime), 0, data, dstPos,6);
			dstPos+=6;

			//ISU状态
			System.arraycopy(Tools.int2Bytes(isustate, 2), 0, data, dstPos,2);
			dstPos+=2;

			//时间限制
			System.arraycopy(Tools.str2Bcd(timeLimit), 0, data, dstPos,5);
			dstPos+=5;

			//次数限制
			System.arraycopy(Tools.str2Bcd(numberTimes), 0, data, dstPos,2);
			dstPos+=2;

			//操作结果
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, dstPos,1);
			dstPos+=1;

			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E0",data);
			AppLog.i("计价器开机应答数据消息数据包："+ Tools.parseByte2HexStr(data));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}


	/**
	 * 计价器关机应答数据消息
	 * @param businessLiceNumber 经营许可证号	BYTE[16]	ASCII字符，长度不足16byte，右补0x00
	 * @param certifNumber 司机从业资格证号	BYTE[19]	ASCII字符，长度不足19byte，右补0x00
	 * @param carNumber 车牌号	BYTE[6]	车牌号，ASCII字符
	 * @param creditCardTime 刷卡时间	BCD[6]	格式为YYYY-MM-DD-hh-mm
	 * @param isustate ISU状态
	 * @param timeLimit 时间限制	BCD[5]	格式为YYYY-MM-DD-hh，全0表示无时间限制
	 * @param numberTimes 次数限制	BCD[2]	0000表示无限制
	 * @param result 0x90：执行正确；0xFX：执行错误，X为错误代码其含义：“F” 表示卡片不存在；“1” 卡片非有效证件；“6”刷卡失败。操作结果为0x90 时，1‐7 项数据有效 其他错误，1‐3 项数据不做判断（限制时间及限制次数为有效数据）。
	 * @return
	 */
	public static byte[] meterShutdownAnswer(String businessLiceNumber,String certifNumber,String carNumber,String creditCardTime,int isustate,String timeLimit,String numberTimes,String result){
		try {

			byte[] data = new byte[57];
			int dstPos = 0;
			//经营许可证号
			System.arraycopy(Tools.stringToByte(Tools.appendRight(businessLiceNumber, 16)), 0, data, dstPos,16);
			dstPos+=16;

			//司机从业资格证号
			System.arraycopy(Tools.stringToByte(Tools.appendRight(certifNumber, 19)), 0, data, dstPos,19);
			dstPos+=19;

			//车牌号
			System.arraycopy(Tools.stringToByte(Tools.appendRight(carNumber, 6)), 0, data, dstPos,6);
			dstPos+=6;

			//刷卡时间
			System.arraycopy(Tools.str2Bcd(creditCardTime), 0, data, dstPos,6);
			dstPos+=6;

			//ISU状态
			System.arraycopy(Tools.int2Bytes(isustate, 2), 0, data, dstPos,2);
			dstPos+=2;

			//时间限制
			System.arraycopy(Tools.str2Bcd(timeLimit), 0, data, dstPos,5);
			dstPos+=5;

			//次数限制
			System.arraycopy(Tools.str2Bcd(numberTimes), 0, data, dstPos,2);
			dstPos+=2;

			//操作结果
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, dstPos,1);
			dstPos+=1;

			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E3",data);
			AppLog.i("计价器关机应答数据消息数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 计价器关机成功应答数据消息
	 * @param result 0x90：执行正确；0xFF：执行错误
	 * @return
	 */
	public static byte[] meterShutdownSuccessAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E4",data);
			AppLog.i("计价器关机成功应答数据消息数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 10.4.2.9 计价器关机当班营运数据汇总补传指令应答数据(保留，不实现)
	 * @param result 0x90：执行正确；0xFF：执行错误
	 * @return
	 */
	public static byte[] meterSummaryDataSupplementsAnswer(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00F1",data);
			AppLog.i("计价器关机当班营运数据汇总补传指令应答数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 计价器心跳指令应答数据
	 * @return
	 */
	public static byte[] meterHeartAnswer(){
		try {
			byte[] data = ByteArrayUtil.concatAll(new byte[]{0x00,0x00},
					Tools.parseHexStr2Byte(SPUtils.getParamString(SPConstants.PARAMS_METER_USEABLE_TIME, "0000000000")),
					new byte[]{0x00},//次数为啥是1而不是2
					new byte[]{0x00,0x00});
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("00E9",data);
			//byte[] bytes = getMeterDtuBody("00E9",null);
			AppLog.i("计价器心跳指令应答数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 营运记录查询指令
	 * @param train 营运车次
	 * @return
	 */
	public static byte[] queryOperatingRecords(int train){
		try {
			byte[] data = new byte[4];
			System.arraycopy(Tools.int2Bytes(train, 4), 0, data, 0,4);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody("0006",data);
			AppLog.i("营运记录查询指令数据包："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/***************************************计价器业务结束************************************************************/

	/*******************************************顶灯业务开始**********************************************************************/
	/**
	 * 智能顶灯状态查询指令
	 * @return
	 */
//	public static byte[] queryLampStatus(){
//		try {
//			byte[] data = new byte[7];
//			String systemdate = DateUtil.getTodayDate(DateUtil.df6); // 获取系统当前时间
//			System.arraycopy(Tools.str2Bcd(systemdate), 0, data, 0,7);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0000",data);
//			AppLog.i("智能顶灯状态查询指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 智能顶灯复位指令（保留，不实现）
	 * @return
	 */
//	public static byte[] queryLampReset(){
//		try {
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0001",null);
//			AppLog.i("智能顶灯复位指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 智能顶灯通讯波特率设置指令
	 * @param baudRate 波特率	0x00:	2400
	 * 						0x01:	4800
	 * 						0x02:	9600 (默认)
	 * 						0x03:	14400
	 * 						0x04:	19200
	 * 						0x05:	38400
	 * 						0x06:	57600
	 * 						0x07:	115200
	 * 						0x08:	128000
	 * @return
	 */
//	public static byte[] setLampBaudRate(int baudRate){
//		try {
//			byte[] data = new byte[1];
//			System.arraycopy(Tools.int2Bytes(baudRate, 1), 0, data, 0,1);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0003",data);
//			AppLog.i("智能顶灯通讯波特率设置指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 2.11	计价器固件升级指令（保留，不实现）
	 * @param 操作结果	UINT8	0x00:	执行正确
	 *							0x01:	设备不支持
	 * 							0x02:	同一版本无需升级
	 *							0x03:	标识信息不一致，无法升级
	 *							OxFF:	执行错误
	 * @return
	 *//*
	public static byte[] meterUpgrade(String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getToplightDtuBody("00FF",data);
			AppLog.i("智能顶灯固件升级指令："+ Tools.parseByte2HexStr(bytes));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}*/

	/**
	 * 智能顶灯固件升级指令（保留，不实现）
	 * @param identifier 厂商标识
	 * @param hardwareVersionNumber 设备硬件版本号
	 * @param softwareVersionNumber 软件主版本号
	 * @param softwareVersionNumber1 软件次版本号
	 * @return
	 */
//	public static byte[] setLampUpgrade(String identifier,String hardwareVersionNumber,String softwareVersionNumber,String softwareVersionNumber1){
//		try {
//			byte[] data = new byte[4];
//			int dstPos = 0;
//			System.arraycopy(Tools.str2Bcd(identifier), 0, data,dstPos,1);
//			dstPos+=1;
//			System.arraycopy(Tools.str2Bcd(hardwareVersionNumber), 0, data,dstPos,1);
//			dstPos+=1;
//			System.arraycopy(Tools.str2Bcd(softwareVersionNumber), 0, data,dstPos,1);
//			dstPos+=1;
//			System.arraycopy(Tools.str2Bcd(softwareVersionNumber1), 0, data,dstPos,1);
//			dstPos+=1;
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("00FF",data);
//			AppLog.i("智能顶灯固件升级指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 营运状态设置指令（必选）
	 * 							空重车状态可由开关控制，其他由终端控制。
	 * @param state 00：空车；01：载客；02：停运；03：电召；04：报警；05：显示防伪密标；06：换班；0xFF：取消
	 * @return
	 */
//	public static byte[] setLampState(String state){
//		/*try {
//			int status = Integer.parseInt(state);
//
//			// 设置运营状态值
//			int operationStatus = 1;	*//**0：运营状态；1：停运状态*//*
//			switch (status) {
//			case 0:
//			case 1:
//			case 3:
//				operationStatus = 0;		// “运营状态”
//				break;
//			case 2:
//			case 4:
//			case 6:
//			case 0xff:
//				operationStatus = 1;		// “停运状态”
//				break;
//			}
//			ConstantsState.setStateValue(4, String.valueOf(operationStatus));
//		} catch (NumberFormatException e1) {
//			// TODO Auto-generated catch block
//			e1.printStackTrace();
//		}*/
//
//		try {
//			byte[] data = new byte[1];
//			int dstPos = 0;
//			System.arraycopy(Tools.str2Bcd(state), 0, data,dstPos,1);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0010",data);
//			AppLog.i("营运状态设置指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 星级状态设置指令（保留，不实现）
	 * @param state		前顶灯	星级		00：未评定；01：一星；02：二星；03：三星；04：四星；05：五星
	 * @param text   	后顶灯	显示文本	STRING	显示的星级相关文本（后顶灯）
	 * @return
	 */
//	public static byte[] setLampStarState(String state, String text){
//		try {
//			byte[] textByte = Tools.stringToByte(text);
//			byte[] data = new byte[1+textByte.length];
//			int dstPos = 0;
//			System.arraycopy(Tools.str2Bcd(state), 0, data,dstPos,1);
//			dstPos += 1;
//			System.arraycopy(textByte, 0, data,dstPos,textByte.length);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0011",data);
//			AppLog.i("星级状态设置指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 防伪密标显示指令（即稽查，必选）
	 * @param state		顶灯密标内容	STRING
	 * @return
	 */
//	public static byte[] setSecurityCodeDisplay(String text){
//		try {
//			byte[] textbyte = Tools.stringToByte(text);
//			byte[] data = new byte[textbyte.length];
//			int dstPos = 0;
//			System.arraycopy(textbyte, 0, data,dstPos,textbyte.length);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0013",data);
//			AppLog.i("防伪密标显示指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 取消防伪密标显示指令	（即稽查，必选）
	 * @return
	 */
//	public static byte[] cancelSecurityCodeDisplay(){
//		try {
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0014",null);
//			AppLog.i("取消防伪密标显示指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 夜间工作模式设指令（保留，不实现）
	 * @param mode 00：关闭夜间模式；01：开启夜间模式
	 * @return
	 */
//	public static byte[] setNightWorkMode(String mode){
//		try {
//			byte[] data = new byte[1];
//			int dstPos = 0;
//			System.arraycopy(Tools.parseHexStr2Byte(mode), 0, data,dstPos,1);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0012",data);
//			AppLog.i("夜间工作模式设置指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 夜间工作模式参数设置指令（保留，不实现）
	 * @param time 开启关闭时间 24小时制，描述小时分钟。格式为：hhmm（起始时间）-hhmm（停止时间）为0x00 0x00 0x00 0x00 时，
	 * 表示由MCU控制顶灯的工作模式。当停止时间小于起始时间时，停止时间为第二天的时间。
	 * @return
	 */
//	public static byte[] setNightWorkModeParam(String time){
//		try {
//			byte[] data = new byte[4];
//			int dstPos = 0;
//			System.arraycopy(Tools.str2Bcd(time), 0, data,dstPos,4);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0020",data);
//			AppLog.i("夜间工作模式设置指令："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 发送预置信息（后顶灯必选）
	 * @param code		编号	UINT8	1-20；所发送编号已经存在时进行覆盖操作
	 * @param showType	显示方式	UINT8	1：自右向左；	2：自下向上	3：自上向下。
	 * @param text		内容	STRING	解密后文本长度<=100字节；按照附录A规则加密
	 * @return
	 */
//	public static byte[] sendPresetInfo(int code, int showType, String text){
//		try {
//			byte[] textByte = Tools.stringToByte(text);
//			byte[] data = new byte[1+1+textByte.length];
//			int dstPos = 0;
//			System.arraycopy(Tools.int2Bytes(code, 1), 0, data,dstPos,1);
//			dstPos += 1;
//			System.arraycopy(Tools.int2Bytes(showType, 1), 0, data,dstPos,1);
//			dstPos += 1;
//			System.arraycopy(textByte, 0, data,dstPos,textByte.length);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0100",data);
//			AppLog.i("发送预置信息（后灯必选）："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 发送临时信息（后顶灯必选）
	 * @param 显示时长	UINT16	单位分钟
	 * @param showType	显示方式	UINT8	1：自右向左；	2：自下向上	3：自上向下。
	 * @param text		内容	STRING	解密后文本长度<=100字节；按照附录A规则加密
	 * @return
	 */
//	public static byte[] sendTempInfo(int minutes, int showType, String text){
//		try {
//			byte[] textByte = Tools.stringToByte(text);
//			byte[] data = new byte[2+1+textByte.length];
//			int dstPos = 0;
//			System.arraycopy(Tools.int2Bytes(minutes, 2), 0, data,dstPos,2);
//			dstPos += 2;
//			System.arraycopy(Tools.int2Bytes(showType, 1), 0, data,dstPos,1);
//			dstPos += 1;
//			System.arraycopy(textByte, 0, data,dstPos,textByte.length);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0101",data);
//			AppLog.i("发送预置信息（后灯必选）："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 删除信息（后顶灯必选）
	 * @param type	删除类型	UINT8	1：预置信息；2：临时信息
	 * @param code	编号		UINT8	1-20；0表示删除所有（临时信息时该字段无效）
	 * @return
	 */
//	public static byte[] deleteInfo(int type, int code){
//		try {
//			int len = 2;
//			if(type == 2){
//				len = 1;
//			}
//			byte[] data = new byte[len];
//			int dstPos = 0;
//			System.arraycopy(Tools.int2Bytes(type, 1), 0, data,dstPos,1);
//			if(type == 1){
//				dstPos += 1;
//				System.arraycopy(Tools.int2Bytes(code, 1), 0, data,dstPos,1);
//			}
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0102",data);
//			AppLog.i("发送预置信息（后灯必选）："+ Tools.parseByte2HexStr(bytes));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 3.15智能顶灯参数设置（后顶灯必选）
	 * @param textSpeed			文本滚动速度	UINT8	单位 点/秒
	 * @param showTime			闪烁显示时长	UINT8	单位 秒
	 * @param exitTime			闪烁熄灭时长	UINT8	单位 秒
	 * @return
	 */
//	public static byte[] setToplightParams(int textSpeed, int showTime, int exitTime){
//		try {
//			byte[] data = new byte[3];
//			int dstPos = 0;
//			System.arraycopy(Tools.int2Bytes(textSpeed, 1), 0, data,dstPos,1);
//			dstPos += 1;
//			System.arraycopy(Tools.int2Bytes(showTime, 1), 0, data,dstPos,1);
//			dstPos += 1;
//			System.arraycopy(Tools.int2Bytes(exitTime, 1), 0, data,dstPos,1);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0103",data);
//			AppLog.i(("3.15智能顶灯参数设置（后顶灯必选）："+ Tools.parseByte2HexStr(bytes)));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 3.16查询预置信息（后顶灯必选）
	 * @param serial		编号	UINT8	1-20
	 * @return
	 */
//	public static byte[] queryPresetInfo(int serial){
//		try {
//			byte[] data = new byte[1];
//			int dstPos = 0;
//			System.arraycopy(Tools.int2Bytes(serial, 1), 0, data,dstPos,1);
//			//合成DTU协议
//			byte[] bytes = getToplightDtuBody("0104",data);
//			AppLog.i(("3.16查询预置信息（后顶灯必选）："+ Tools.parseByte2HexStr(bytes)));
//			return bytes;
//		} catch (Exception e) {
//			AppLog.e(ExceptionUtil.getInfo(e));
//			e.printStackTrace();
//			return null;
//		}
//	}

	/**
	 * 结果通用应答
	 * @param result
	 * @return
	 */
	public static byte[] answerResult(String answerId, String result){
		try {
			byte[] data = new byte[1];
			System.arraycopy(Tools.parseHexStr2Byte(result), 0, data, 0,1);
			//合成DTU协议
			byte[] bytes = getMeterDtuBody(answerId,data);
			AppLog.i(("计价器结果应答"+ Tools.parseByte2HexStr(bytes)));
			return bytes;
		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 合成整条计价器Dtu协议
	 * @param mid 命令字ID
	 * @param data 55AA数据 区
	 * @param deviceID 设备类型
	 * @return
	 */
	public static byte[] getMeterDtuBody(String mid,byte[] data){
		//合成整条55AA协议
		byte[] databyte = getBody(mid, data,"02");
//		//处理头域
//		byte[] headdomainbyte = DTUEncoder.getHeadDomainByte("92",databyte.length);
//		//处理整个消息
//		byte[] bytes = DTUEncoder.getDTUBodyByte(headdomainbyte, databyte);
		return databyte;
	}


	/**
	 * 合成整条顶灯Dtu协议
	 * @param mid 命令字ID
	 * @param data 55AA数据 区
	 * @param deviceID 设备类型
	 * @return
	 */
//	public static byte[] getToplightDtuBody(String mid,byte[] data){
//		//合成整条55AA协议
//		byte[] databyte = getBody(mid, data,"05");
//		//处理头域
//		byte[] headdomainbyte = DTUEncoder.getHeadDomainByte("94",databyte.length);
//		//处理整个消息
//		byte[] bytes = DTUEncoder.getDTUBodyByte(headdomainbyte, databyte);
//		return bytes;
//	}



	/**
	 * 编码55AA数据包
	 * @param mid  命令字
	 * @param databyte 数据区
	 * @param DeviceID 设备类型
	 * @return
	 */
	public static byte[] getBody(String mid, byte[] databyte, String deviceID){
		int dstPos = 0;
		int len = 0;
		if(databyte == null){
			len = 11;
		}else{
			len = 11+databyte.length;
		}

		byte[] bodybyte =  new byte[len];
		try {
			dstPos = 0;
			//起始位
			System.arraycopy(Tools.parseHexStr2Byte("55AA"), 0, bodybyte, dstPos, 2);
			dstPos +=2;
			//包长度
			int blen = 4;
			if(databyte!=null){
				blen = blen+databyte.length;
			}
			System.arraycopy(Tools.sortToByte(Tools.int2Bytes(blen, 2)), 0, bodybyte, dstPos, 2);
			dstPos +=2;
			//设备类型	计价器设备类型为0x02，智能顶灯设备类型为0x05，GPS智能服务终端设备类型时0x00
			System.arraycopy(Tools.parseHexStr2Byte(deviceID), 0, bodybyte, dstPos, 1);
			dstPos +=1;

			//厂商标识
			System.arraycopy(Tools.parseHexStr2Byte("02"), 0, bodybyte, dstPos, 1);
			dstPos +=1;

			//命令字
			System.arraycopy(Tools.parseHexStr2Byte(mid), 0, bodybyte, dstPos, 2);
			dstPos +=2;

			//数据区
			if(databyte!=null){
				System.arraycopy(databyte, 0, bodybyte, dstPos, databyte.length);
				dstPos +=databyte.length;
			}
			int n = 0;
			if(databyte != null){
				n = databyte.length;
			}
			//校验码
			byte[] jyw = Tools.byteOrbyte(Tools.byteTobyte(bodybyte,2, 6+n));
			System.arraycopy(jyw, 0, bodybyte, dstPos, 1);
			dstPos +=1;

			//结束位
			System.arraycopy(Tools.parseHexStr2Byte("55AA"), 0, bodybyte, dstPos, 2);

			// 转义
			bodybyte = Tools.trope55aa(bodybyte, Tools.ENCODER_TYPE);

		} catch (Exception e) {
			AppLog.e(ExceptionUtil.getInfo(e));
			e.printStackTrace();
		}
		return bodybyte;
	}

}


